from . import index_blue
import logging
from news_info_app import redis_store
from flask import current_app, render_template, session, jsonify, request, g

from ...models import User, News, Category
from ...utils.common import login_require
from ...utils.response_code import RET



@index_blue.route('/newslist')
def news_list():
    """
    1. 获取参数
    2. 参数类型转换
    3. 分页查询
    4. 获取到分页对象中的属性,总页数,当前页,当前页的对象列表
    5. 将对象列表转成字典列表
    6. 携带数据,返回响应
    :return:
    """
    # 1. 获取参数
    cid = request.args.get('cid', '1')  # 默认值
    page = request.args.get('page', '1')
    per_page = request.args.get('per_page', '10')
    # 2. 参数类型转换
    try:
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
        per_page = 10
    # 3. 分页查询
    try:
        """
            if cid == '1':  # cid为表示最新新闻，是按照所有新闻的倒叙排列  所有新闻的cid都不为1
                paginate = News.query.order_by(News.create_time.desc()).paginate(page, per_page)
            else:
                paginate = News.query.filter(News.category_id == cid).order_by(News.create_time.desc()).paginate(page, per_page)
        """
        filters = [News.status == 0]
        if cid != '1':
            filters.append(News.category_id == cid)  # 拆包，可以后续加入多种过滤条件
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,
                                                                                          per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="获取新闻失败")
    # 4. 获取到分页对象中的属性,总页数,当前页,当前页的对象列表
    totalPage = paginate.pages
    currentpage = paginate.page
    items = paginate.items

    # 5. 将对象列表转成字典列表
    news_dict_list = [news.to_dict() if news else None for news in items]
    # 6. 携带数据,返回响应

    return jsonify(errno=RET.OK, errmsg="获取新闻成功", totalPage=totalPage, currentpage=currentpage, newsList=news_dict_list)


# .首页新闻列表 局部更新 ajax请求
# 请求路径: /newslist
# 请求方式: GET
# 请求参数: cid,page,per_page

@index_blue.route('/', methods=['GET', 'POST'])
@login_require
def index_show():
    # 测试redis数据库
    # redis_store.set('name', '周杰伦')
    # print(redis_store.get('name'))
    # 测试 session存取
    # session['name'] = '王力宏'
    # print(session.get('name'))
    # logging.debug('输出调试信息')
    # logging.info('输出详细信息')
    # logging.warning('输出警告信息')
    # logging.error('输出错误信息')

    # 也可以使用flask_app来输出日志信息
    # current_app.logger.debug('输出调试信息1')
    # current_app.logger.info('输出详细信息1')
    # current_app.logger.warning('输出警告信息1')
    # current_app.logger.error('输出错误信息1')

    # # 1. 获取用户的登录信息
    # user_id = session.get('user_id')
    # # 2.根据user_id确定用户信息
    # user = None
    # if user_id:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)
    # 3.根据点击量查询前十条热门新闻，一并拼接到data
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(10).all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查取新闻失败")
    # 将新闻列表转换成字典
    news_list = [news.to_dict() if news else None for news in news_list]
    # .拼接用户数据，渲染页面

    user_info = g.user.to_dict() if g.user else ''
    # 4. 新闻分类数据的展示
    try:
        category_list = Category.query.filter().all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻类别失败")
    # 将对象类别转为字典列表
    category_list = [category.to_dict() if category else None for category in category_list]
    data = {
        'user_info': user_info,
        'news_list': news_list,
        'category_list': category_list
    }
    return render_template('news/index.html', data=data)


# 返回值: data数据


@index_blue.route('/favicon.ico/')
def send_logo():
    return current_app.send_static_file('news/favicon.ico')


# 404 返回
@index_blue.route('/404')
@login_require
def page_not_found():
    data = {
        'user_info': g.user.to_dict() if g.user else None
    }
    return render_template('news/404.html', data=data)
